class FireBall extends AcGameObject {
    constructor(playground, player, x, y, radius, vx, vy, color, speed, move_length, damage) {
        super();
        this.playground = playground;  // 游戏战场对象
        this.player = player;  // 发射火球的玩家
        this.ctx = this.playground.game_map.ctx;  // 画布上下文
        this.x = x;  // 火球初始x坐标
        this.y = y;  // 火球初始y坐标
        this.vx = vx;  // 火球在x轴上的速度分量
        this.vy = vy;  // 火球在y轴上的速度分量
        this.radius = radius;  // 火球半径
        this.color = color;  // 火球颜色
        this.speed = speed;  // 火球移动速度
        this.move_length = move_length;  // 火球最大移动距离
        this.damage = damage;  // 火球伤害值
        this.eps = 0.1;  // 距离误差阈值
    }

    start() {
        // 火球对象初始化完成后调用，当前为空实现
    }

    update() {
        // 每一帧更新火球状态
        if (this.move_length < this.eps) {
            // 如果移动距离已用完，则销毁火球
            this.destroy();
            return false;
        }

        // 计算这一帧移动的距离
        let moved = Math.min(this.move_length, this.speed * this.timedelta / 1000);
        // 更新火球位置
        this.x += this.vx * moved;
        this.y += this.vy * moved;
        // 减少剩余可移动距离
        this.move_length -= moved;

        // 检测与其他玩家的碰撞
        for (let i = 0; i < this.playground.players.length; i ++ ) {
            let player = this.playground.players[i];
            // 不检测与发射者本身的碰撞
            if (this.player !== player && this.is_collision(player)) {
                this.attack(player);  // 攻击碰撞的玩家
            }
        }

        this.render();  // 渲染火球
    }

    get_dist(x1, y1, x2, y2) {
        // 计算两点间距离
        let dx = x1 - x2;
        let dy = y1 - y2;
        return Math.sqrt(dx * dx + dy * dy);
    }

    is_collision(player) {
        // 检测与玩家是否发生碰撞
        let distance = this.get_dist(this.x, this.y, player.x, player.y);
        // 如果距离小于两者半径之和，则发生碰撞
        if (distance < this.radius + player.radius)
            return true;
        return false;
    }

    attack(player) {
        // 攻击玩家
        let angle = Math.atan2(player.y - this.y, player.x - this.x);  // 计算攻击角度
        player.is_attacked(angle, this.damage);  // 对玩家造成伤害
        this.destroy();  // 销毁火球
    }

    render() {
        // 渲染火球
        this.ctx.beginPath();
        this.ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false);  // 绘制圆形
        this.ctx.fillStyle = this.color;  // 设置填充颜色
        this.ctx.fill();  // 填充绘制
    }
}
